//go:build !windows

// 运行CMD命令
// 此处的命令需要在Linux下执行，请注意
package xcmd

import (
	"fmt"
	"os"
	"strings"
)

var is_windows bool = false

// 命令结构体
type cmds struct {
	Name       string // 命令名称
	Path       string // 命令地址
	Exist      bool   // 是否存在
	ExistClear bool   // 是否取消强制
}

const (
	CONVERT  = iota // 常量0，用于确定命令位置
	FFMPEG          // 1
	GREP            // 2
	CUT             // 3
	SED             // 4
	QRENCODE        // 5
	IDENTIFY        // 6
	HEAD            // 7
	AWK             // 8
	BASH            // 9
	FILE            // 10
	FIND            // 11
	ZBARIMG         // 12
)

// 待检测的命令【必须要存在的命令列表】
var cmd_check []cmds = []cmds{
	{Name: "convert", ExistClear: true},  // 0 ImageMagick 图片转换
	{Name: "ffmpeg", ExistClear: true},   // 1 视频转换
	{Name: "grep"},                       // 2
	{Name: "cut"},                        // 3
	{Name: "sed"},                        // 4
	{Name: "qrencode", ExistClear: true}, // 5 qrencode 二维码生成
	{Name: "identify", ExistClear: true}, // 6 ImageMagick 图片转换
	{Name: "head"},                       // 7
	{Name: "awk"},                        // 8
	{Name: "bash"},                       // 9
	{Name: "file"},                       // 10
	{Name: "find"},                       // 11
	{Name: "zbarimg", ExistClear: true},  // 12 zbar-tools 二维码识别库
}

// 检测当前服务中的命令是否存在
func init() {
	// 命令存放位置
	paths := strings.Split(os.Getenv("PATH"), ":")
	path_count := len(paths)
	for i := 0; i < len(cmd_check); i++ {
		for j := 0; j < path_count; j++ {
			if _, err := os.Stat(paths[j] + "/" + cmd_check[i].Name); err == nil {
				cmd_check[i].Path = paths[j] + "/" + cmd_check[i].Name
				cmd_check[i].Exist = true
			}
		}
		if cmd_check[i].Exist {
			continue
		}
	}
	// 命令检测
	nots := []string{}
	for _, v := range cmd_check {
		if !v.Exist && !v.ExistClear {
			nots = append(nots, v.Name)
		}
	}
	if len(nots) > 0 {
		fmt.Println("命令 ", strings.Join(nots, ", "), " 不存在")
		panic("命令依赖检测不完整，请手动安装以上命令")
	}
}
